// 任务执行模块

#pragma once

#include <iostream>
#include <string>
#include <cstdio>
#include <set>

class Command
{
private:
    std::set<std::string> _whilte_list; // 命令白名单
public:
    Command()
    {
        _whilte_list.insert("ls");
        _whilte_list.insert("pwd");
        _whilte_list.insert("ls -l");
        _whilte_list.insert("ll");
        _whilte_list.insert("who");
        _whilte_list.insert("whoami");
        _whilte_list.insert("ps axj");
    }
    bool SafeCheck(const std::string &cmdstr)
    {
        auto iter = _whilte_list.find(cmdstr);
        if (iter == _whilte_list.end())
        {
            return false;
        }
        return true;
    }

    std::string Execute(std::string cmdstr)
    {

        if (!SafeCheck(cmdstr))
        {
            return std::string(cmdstr + " 不支持");
        }

        FILE *fp = popen(cmdstr.c_str(), "r");
        if (nullptr == fp)
        {
            return std::string("Failed");
        }

        char buffer[1024];
        std::string result;
        while (true)
        {
            char *ret = ::fgets(buffer, sizeof(buffer), fp);
           if(!ret)
           break;
           result+=ret;
        }
        pclose(fp);
        return result.empty() ? std::string("Done") : result;
    }
};
